package org.basis.algorithm.ergodic;

/**
 * 数组遍历
 *
 * @author wenpan 2024/03/03 12:23
 */
public class ArrayErgodic {

    public static void main(String[] args) {
        int[][] nums = new int[][]{
                // 8行9列
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9}
        };

        // 正向打印
        System.out.println("=========================== 从第一个元素开始，正向打印 ===========================");
        arrayForwardDirection(nums);

        // 从最后一个元素开始，先向上然后向左打印
        System.out.println("=========================== 从最后一个元素开始，先向上然后向左打印 ===========================");
        arrayReverse(nums);

        // 从最后一个元素开始，先向上然后向左打印
        System.out.println("=========================== 从最后一个元素开始，先向上然后向左打印 ===========================");
        arrayReverse2(nums);
        System.out.println("=========================== 从左下角第一个元素开始，先向左然后向上打印 ===========================");
        arrayReverse3(nums);
        System.out.println("=========================== 从左下角第一个元素开始，先向上然后向左打印 ===========================");
        arrayReverse4(nums);
        System.out.println("=========================== 从右上角第一个元素开始，先向下然后向左打印 ===========================");
        arrayReverse5(nums);
        System.out.println("=========================== 从右上角第一个元素开始，先向左然后向下打印 ===========================");
        arrayReverse6(nums);
    }

    /**
     * 二维数组按照斜线遍历
     */
    public static void arrayDiagonalTraversal(int[][] nums) {

    }

    /**
     * 二维数组逆向遍历（从右上角最后一个位置开始，先向左在向下遍历）
     */
    public static void arrayReverse6(int[][] nums) {
        // 行先固定，遍历每一列
        for (int line = 0; line < nums.length - 1; line++) {
            for (int col = nums[0].length - 1; col >= 0; col--) {
                if (col == 0) {
                    System.out.println(nums[line][col]);
                } else {
                    System.out.print(nums[line][col] + ",");
                }
            }
        }
    }

    /**
     * 二维数组逆向遍历（从右上角最后一个位置开始，先向下在向左遍历）
     */
    public static void arrayReverse5(int[][] nums) {
        // 列先固定，遍历该列的每一行
        for (int col = nums[0].length - 1; col >= 0; col--) {
            for (int line = 0; line < nums.length; line++) {
                if (line == nums.length - 1) {
                    System.out.println(nums[line][col]);
                } else {
                    System.out.print(nums[line][col] + ",");
                }
            }
        }
    }

    /**
     * 二维数组逆向遍历（从左下角最后一个位置开始，先向上在向左遍历）
     */
    public static void arrayReverse4(int[][] nums) {
        // 列固定，行变动
        for (int col = 0; col < nums[0].length; col++) {
            for (int line = nums.length - 1; line >= 0; line--) {
                if (line == 0) {
                    System.out.println(nums[line][col]);
                } else {
                    System.out.print(nums[line][col] + ",");
                }
            }
        }
    }

    /**
     * 二维数组逆向遍历（从左下角最后一个位置开始，先向左在向上遍历）
     */
    public static void arrayReverse3(int[][] nums) {
        // 由于是从左到右，那么就是说对于每一行都是向右遍历
        for (int line = nums.length - 1; line >= 0; line--) {
            // 对于每一行来说，列依次向后推进即可
            for (int col = 0; col < nums[0].length; col++) {
                if (col == nums[0].length - 1) {
                    System.out.println(nums[line][col]);
                } else {
                    System.out.print(nums[line][col] + ",");
                }
            }
        }
    }

    /**
     * 二维数组逆向遍历（从最后一个位置开始，先向上遍历，然后向左遍历）
     */
    public static void arrayReverse2(int[][] nums) {
        // 列
        for (int col = nums[0].length - 1; col >= 0; col--) {
            // 对每列来说，倒着逐一遍历他的行
            for (int line = nums.length - 1; line >= 0; line--) {
                if (line == 0) {
                    // 到达第一行时需要换行打印
                    System.out.println(nums[line][col]);
                } else {
                    System.out.print(nums[line][col] + ",");
                }
            }
        }
    }

    /**
     * 二维数组逆向遍历（从最后一个位置逐行向前遍历）
     */
    public static void arrayReverse(int[][] nums) {
        // 最后一行开始
        for (int i = nums.length - 1; i >= 0; i--) {
            // 从最后一列开始
            for (int j = nums[0].length - 1; j >= 0; j--) {
                // 最后一个元素不打印逗号以及需要换行
                if (j == 0) {
                    System.out.println(nums[i][j]);
                } else {
                    System.out.print(nums[i][j] + ",");
                }
            }
        }
    }

    /**
     * 二维数组正向遍历
     */
    public static void arrayForwardDirection(int[][] nums) {
        // 一行一行的遍历
        for (int i = 0; i < nums.length; i++) {
            // 遍历i行的每一列
            for (int j = 0; j < nums[0].length; j++) {
                if (j == nums[0].length - 1) {
                    // 最后一个数字不加逗号并且要换行
                    System.out.println(nums[i][j]);
                } else {
                    System.out.print(nums[i][j] + ",");
                }
            }

        }
    }
}
